{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast Sign Adversary Generation Example\n",
    "\n",
    "This notebook demos find adversary example by using symbolic API and integration with Numpy\n",
    "Reference: \n",
    "\n",
    "[1] Goodfellow, Ian J., Jonathon Shlens, and Christian Szegedy. \"Explaining and harnessing adversarial examples.\" arXiv preprint arXiv:1412.6572 (2014).\n",
    "https://arxiv.org/abs/1412.6572"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import mxnet as mx\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.cm as cm\n",
    "\n",
    "from data import mnist_iterator"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Build Network\n",
    "\n",
    "note: in this network, we will calculate softmax, gradient in numpy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dev = mx.gpu()\n",
    "batch_size = 100\n",
    "train_iter, val_iter = mnist_iterator(batch_size=batch_size, input_shape = (1,28,28))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# input\n",
    "data = mx.symbol.Variable('data')\n",
    "# first conv\n",
    "conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=20)\n",
    "tanh1 = mx.symbol.Activation(data=conv1, act_type=\"tanh\")\n",
    "pool1 = mx.symbol.Pooling(data=tanh1, pool_type=\"max\",\n",
    "                          kernel=(2,2), stride=(2,2))\n",
    "# second conv\n",
    "conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), num_filter=50)\n",
    "tanh2 = mx.symbol.Activation(data=conv2, act_type=\"tanh\")\n",
    "pool2 = mx.symbol.Pooling(data=tanh2, pool_type=\"max\",\n",
    "                          kernel=(2,2), stride=(2,2))\n",
    "# first fullc\n",
    "flatten = mx.symbol.Flatten(data=pool2)\n",
    "fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)\n",
    "tanh3 = mx.symbol.Activation(data=fc1, act_type=\"tanh\")\n",
    "# second fullc\n",
    "fc2 = mx.symbol.FullyConnected(data=tanh3, num_hidden=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def Softmax(theta):\n",
    "    max_val = np.max(theta, axis=1, keepdims=True)\n",
    "    tmp = theta - max_val\n",
    "    exp = np.exp(tmp)\n",
    "    norm = np.sum(exp, axis=1, keepdims=True)\n",
    "    return exp / norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def LogLossGrad(alpha, label):\n",
    "    grad = np.copy(alpha)\n",
    "    for i in range(alpha.shape[0]):\n",
    "        grad[i, label[i]] -= 1.\n",
    "    return grad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepare useful data for the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data_shape = (batch_size, 1, 28, 28)\n",
    "arg_names = fc2.list_arguments() # 'data' \n",
    "arg_shapes, output_shapes, aux_shapes = fc2.infer_shape(data=data_shape)\n",
    "\n",
    "arg_arrays = [mx.nd.zeros(shape, ctx=dev) for shape in arg_shapes]\n",
    "grad_arrays = [mx.nd.zeros(shape, ctx=dev) for shape in arg_shapes]\n",
    "reqs = [\"write\" for name in arg_names]\n",
    "\n",
    "model = fc2.bind(ctx=dev, args=arg_arrays, args_grad = grad_arrays, grad_req=reqs)\n",
    "arg_map = dict(zip(arg_names, arg_arrays))\n",
    "grad_map = dict(zip(arg_names, grad_arrays))\n",
    "data_grad = grad_map[\"data\"]\n",
    "out_grad = mx.nd.zeros(model.outputs[0].shape, ctx=dev)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Init weight "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for name in arg_names:\n",
    "    if \"weight\" in name:\n",
    "        arr = arg_map[name]\n",
    "        arr[:] = mx.rnd.uniform(-0.07, 0.07, arr.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def SGD(weight, grad, lr=0.1, grad_norm=batch_size):\n",
    "    weight[:] -= lr * grad / batch_size\n",
    "\n",
    "def CalAcc(pred_prob, label):\n",
    "    pred = np.argmax(pred_prob, axis=1)\n",
    "    return np.sum(pred == label) * 1.0\n",
    "\n",
    "def CalLoss(pred_prob, label):\n",
    "    loss = 0.\n",
    "    for i in range(pred_prob.shape[0]):\n",
    "        loss += -np.log(max(pred_prob[i, label[i]], 1e-10))\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Train a network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:11: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n",
      "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:4: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Accuracy: 0.92\t Train Loss: 0.28074\n",
      "Train Accuracy: 0.98\t Train Loss: 0.08431\n",
      "Train Accuracy: 0.98\t Train Loss: 0.05848\n",
      "Train Accuracy: 0.99\t Train Loss: 0.04575\n"
     ]
    }
   ],
   "source": [
    "num_round = 4\n",
    "train_acc = 0.\n",
    "nbatch = 0\n",
    "for i in range(num_round):\n",
    "    train_loss = 0.\n",
    "    train_acc = 0.\n",
    "    nbatch = 0\n",
    "    train_iter.reset()\n",
    "    for batch in train_iter:\n",
    "        arg_map[\"data\"][:] = batch.data[0]\n",
    "        model.forward(is_train=True)\n",
    "        theta = model.outputs[0].asnumpy()\n",
    "        alpha = Softmax(theta)\n",
    "        label = batch.label[0].asnumpy()\n",
    "        train_acc += CalAcc(alpha, label) / batch_size\n",
    "        train_loss += CalLoss(alpha, label) / batch_size\n",
    "        losGrad_theta = LogLossGrad(alpha, label)\n",
    "        out_grad[:] = losGrad_theta\n",
    "        model.backward([out_grad])\n",
    "        # data_grad[:] = grad_map[\"data\"]\n",
    "        for name in arg_names:\n",
    "            if name != \"data\":\n",
    "                SGD(arg_map[name], grad_map[name])\n",
    "        \n",
    "        nbatch += 1\n",
    "    #print(np.linalg.norm(data_grad.asnumpy(), 2))\n",
    "    train_acc /= nbatch\n",
    "    train_loss /= nbatch\n",
    "    print(\"Train Accuracy: %.2f\\t Train Loss: %.5f\" % (train_acc, train_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get pertubation by using fast sign method, check validation change.\n",
    "See that the validation set was almost entirely correct before the perturbations, but after the perturbations, it is much worse than random guessing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Val Batch Accuracy: ', 0.98999999999999999)\n",
      "('Val Batch Accuracy after pertubation: ', 0.02)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:4: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n"
     ]
    }
   ],
   "source": [
    "val_iter.reset()\n",
    "batch = val_iter.next()\n",
    "data = batch.data[0]\n",
    "label = batch.label[0]\n",
    "arg_map[\"data\"][:] = data\n",
    "model.forward(is_train=True)\n",
    "theta = model.outputs[0].asnumpy()\n",
    "alpha = Softmax(theta)\n",
    "print(\"Val Batch Accuracy: \", CalAcc(alpha, label.asnumpy()) / batch_size)\n",
    "#########\n",
    "grad = LogLossGrad(alpha, label.asnumpy())\n",
    "out_grad[:] = grad\n",
    "model.backward([out_grad])\n",
    "noise = np.sign(data_grad.asnumpy())\n",
    "arg_map[\"data\"][:] = data.asnumpy() + 0.15 * noise\n",
    "model.forward(is_train=True)\n",
    "raw_output = model.outputs[0].asnumpy()\n",
    "pred = Softmax(raw_output)\n",
    "print(\"Val Batch Accuracy after pertubation: \", CalAcc(pred, label.asnumpy()) / batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualize an example after pertubation.\n",
    "Note that the prediction is consistently incorrect."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true: 5\n",
      "pred: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f61ec17dd50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random as rnd\n",
    "idx = rnd.randint(0, 99)\n",
    "images = data.asnumpy()  + 0.15 * noise\n",
    "plt.imshow(images[idx, :].reshape(28,28), cmap=cm.Greys_r)\n",
    "print(\"true: %d\" % label.asnumpy()[idx])\n",
    "print(\"pred: %d\" % np.argmax(pred, axis=1)[idx])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
